package ongd.negocio.gestion;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Clase que corresponde a la entidad Cuota de la base de datos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@Entity
@Table(name = "cuota")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Cuota.findAll", query = "SELECT c FROM Cuota c"),
    @NamedQuery(name = "Cuota.findByIdCuota", query = "SELECT c FROM Cuota c WHERE c.cuotaPK.idCuota = :idCuota"),
    @NamedQuery(name = "Cuota.findByFechaCreacion", query = "SELECT c FROM Cuota c WHERE c.fechaCreacion = :fechaCreacion"),
    @NamedQuery(name = "Cuota.findByFechaPago", query = "SELECT c FROM Cuota c WHERE c.fechaPago = :fechaPago"),
    @NamedQuery(name = "Cuota.findByCantidad", query = "SELECT c FROM Cuota c WHERE c.cantidad = :cantidad"),
    @NamedQuery(name = "Cuota.findByEstado", query = "SELECT c FROM Cuota c WHERE c.estado = :estado"),
    @NamedQuery(name = "Cuota.findByPersonaDNI", query = "SELECT c FROM Cuota c WHERE c.cuotaPK.personaDNI = :personaDNI"),
    @NamedQuery(name = "Cuota.findByAlerta", query = "SELECT c FROM Cuota c WHERE c.alerta = :alerta")})
public class Cuota extends Entidad implements Serializable {

    /**
     * Atributo serialVersionUID.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Atributo que corresponde con la clave primaria.
     */
    @EmbeddedId
    protected CuotaPK cuotaPK;
    /**
     * Atributo que corresponde con la fecha de creación de la cuota.
     */
    @Basic(optional = false)
    @Column(name = "Fecha_Creacion")
    @Temporal(TemporalType.DATE)
    private Date fechaCreacion;
    /**
     * Atributo que corresponde con la fecha de pago de la cuota.
     */
    @Column(name = "Fecha_Pago")
    @Temporal(TemporalType.DATE)
    private Date fechaPago;
    /**
     * Atributo que corresponde con la cantidad que se va a pagar en la cuota.
     */
    @Basic(optional = false)
    @Column(name = "Cantidad")
    private double cantidad;
    /**
     * Atributo que corresponde con el estado de la cuota.
     */
    @Basic(optional = false)
    @Column(name = "Estado")
    private String estado;
    /**
     * Atributo que indica si se ha alertado del pago de la cuota.
     */
    @Basic(optional = false)
    @Column(name = "Alerta")
    private boolean alerta;
    /**
     * Atributo que corresponde con el dni de la persona a la que pertenece la cuota.
     */
    @JoinColumn(name = "persona_DNI", referencedColumnName = "DNI", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Persona persona;

    /**
     * Constructor de la clase.
     */
    public Cuota() {
    }

    /**
     * Constructor de la clase. 
     * @param cuotaPK identificador de la cuota. 
     */
    public Cuota(CuotaPK cuotaPK) {
        this.cuotaPK = cuotaPK;
    }

    /**
     * Constructor de la clase.
     * @param cuotaPK identificador de la cuota.
     * @param fechaCreacion fecha de creación de la cuota.
     * @param cantidad cantidad de la cuota.
     * @param estado estado de la cuota.
     * @param alerta indicador del envio de emails. 
     */
    public Cuota(CuotaPK cuotaPK, Date fechaCreacion, double cantidad, String estado, boolean alerta) {
        this.cuotaPK = cuotaPK;
        this.fechaCreacion = fechaCreacion;
        this.cantidad = cantidad;
        this.estado = estado;
        this.alerta = alerta;
    }

    /**
     * Constructor de la clase.
     * @param idCuota identificador de la cuota.
     * @param personaDNI persona a la que pertenece la cuota. 
     */
    public Cuota(int idCuota, String personaDNI) {
        this.cuotaPK = new CuotaPK(idCuota, personaDNI);
    }

    /**
     * Método que devuelve la clave primaria de la cuota.
     * @return cuotaPK.
     * @see #setCuotaPK
     */
    public CuotaPK getCuotaPK() {
        return cuotaPK;
    }

    /**
     * Método que asigna un nuevo valor al identificador de la cuota.
     * @param cuotaPK nueva clave
     * @see #getCuotaPK
     */
    public void setCuotaPK(CuotaPK cuotaPK) {
        this.cuotaPK = cuotaPK;
    }

    /**
     * Método que devuelve la fecha de creación de la cuota.
     * @return fechaCreacion.
     * @see #setFechaCreacion
     */
    public Date getFechaCreacion() {
        return fechaCreacion;
    }

    /**
     * Método que asigna un nuevo valor a la fecha de creación.
     * @param fechaCreacion nueva fecha. 
     * @see #getFechaCreacion
     */
    public void setFechaCreacion(Date fechaCreacion) {
        this.fechaCreacion = fechaCreacion;
    }

    /**
     * Método que devuelve la fecha de pago.
     * @return fechaPago.
     * @see #setFechaPago
     */
    public Date getFechaPago() {
        return fechaPago;
    }

    /**
     * Método que asigna una nueva fecha de pago.
     * @param fechaPago nueva fecha. 
     * @see #getFechaPago
     */
    public void setFechaPago(Date fechaPago) {
        this.fechaPago = fechaPago;
    }

    /**
     * Método que devuelve la cantidad de la cuota.
     * @return cantidad.
     * @see #setCantidad
     */
    public double getCantidad() {
        return cantidad;
    }

    /**
     * Método que asigna una nueva cantidad.
     * @param cantidad nueva cantidad. 
     * @see #getCantidad
     */
    public void setCantidad(double cantidad) {
        this.cantidad = cantidad;
    }

    /**
     * Método que devuelve el estado de la cuota.
     * @return estado.
     * @see #setEstado
     */
    public String getEstado() {
        return estado;
    }

    /**
     * Método que asigna un nuevo estado a la cuota.
     * @param estado nuevo estado.
     * @see #getEstado
     */
    public void setEstado(String estado) {
        this.estado = estado;
    }

    /**
     * Método que indica si se han enviado alertas de esa cuota.
     * @return alerta.
     * @see #setAlerta
     */
    public boolean getAlerta() {
        return alerta;
    }

    /**
     * Método que asigna un nuevo valor a la alerta de la cuota.
     * @param alerta nueva alerta. 
     * @see #getAlerta
     */
    public void setAlerta(boolean alerta) {
        this.alerta = alerta;
    }

    /**
     * Método que devuelve la persona a la que le pertenece la cuota.
     * @return persona.
     * @see #setPersona
     */
    public Persona getPersona() {
        return persona;
    }

    /**
     * Método que asigna una nueva persona a la cuota.
     * @param persona nueva persona.
     * @see #getPersona
     */
    public void setPersona(Persona persona) {
        this.persona = persona;
    }

    /**
     * Método que nos dice si una cuota está pendiente.
     * @return true si esta pendiente o false si no es así.
     */
    public boolean esPendiente() {
        return (estado.compareTo("P") == 0);
    }

    /**
     * Método que nos dice si una cuota está abonada.
     * @return true si esta abonada o false si no es así.
     */
    public boolean esAbonada() {
        return (estado.compareTo("A") == 0);
    }

    /**
     * Método que nos dice si una cuota está cancelada.
     * @return true si esta cancelada o false si no es así.
     */
    public boolean esCancelada() {
        return (estado.compareTo("C") == 0);
    }

    /**
     * Método que pone la cuota a pendiente.
     */
    public void establecerPendiente() {
        this.estado = "P";
    }

    /**
     * Método que pone la cuota a abonada.
     */
    public void establecerAbonada() {
        this.estado = "A";
    }

    /**
     * Método que pone la cuota a cancelada.
     */
    public void establecerCancelada() {
        this.estado = "C";
    }

    /**
     * Método que devuelve un número con una propiedad fundamental, si dos 
     * objetos son iguales el valor retornado por sus respectivos hashCode 
     * debe ser igual.
     * @return hash
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (cuotaPK != null ? cuotaPK.hashCode() : 0);
        return hash;
    }

    /**
     * Método que compara si dos cuotas son iguales.
     * @param object Objeto a comparar
     * @return true o false
     */
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Cuota)) {
            return false;
        }
        Cuota other = (Cuota) object;
        if ((this.cuotaPK == null && other.cuotaPK != null) || (this.cuotaPK != null && !this.cuotaPK.equals(other.cuotaPK))) {
            return false;
        }
        return true;
    }

    /**
     * Método que devuelve una cadena con la cuota.
     * @return string
     */
    @Override
    public String toString() {
        return "ongd.negocio.gestion.Cuota[ cuotaPK=" + cuotaPK + " ]";
    }
}
